package com.genreate.util.pay.wx.exception;

import com.wechat.pay.java.core.exception.HttpException;
import com.wechat.pay.java.core.exception.MalformedMessageException;
import com.wechat.pay.java.core.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 微信支付服务异常处理工具类
 */
@Slf4j
public class WxPayExceptionHandler {
    /**
     * 执行服务方法并处理公共异常
     * @param executor 服务执行器（封装具体的服务调用逻辑）
     * @param errorMsg 异常时的错误提示信息（如"关闭订单失败"、"查询订单失败"）
     * @param <T> 返回值类型
     * @return 服务调用的返回结果
     */
    public static <T> T handle(ServiceExecutor<T> executor, String errorMsg) {
        try {
            // 执行具体的服务方法（如service.prepay(request)）
            return executor.execute();
        } catch (HttpException e) { // 发送HTTP请求失败
            e.printStackTrace();
            log.error("HTTP请求失败：{}，请求信息：{}", e.getMessage(), e.getHttpRequest());
        } catch (ServiceException e) { // 服务返回非200状态码（如500）
            e.printStackTrace();
            log.error("服务响应异常：{}，返回体：{}", e.getMessage(), e.getResponseBody());
        } catch (MalformedMessageException e) { // 返回体解析失败
            e.printStackTrace();
            log.error("返回体解析失败：{}", e.getMessage());
        }
        // 所有异常最终统一抛出运行时异常（或根据业务返回特定结果）
        throw new RuntimeException(errorMsg);
    }
}